// download.js
const { getBaseUrl } = require('../../config/api.js')

Page({
  data: {
    videoData: null,
    isLoading: false,
    downloadProgress: 0,
    downloadFailed: false,
    retryCount: 0,
    maxRetries: 3
  },

  onLoad(options) {
    if (options.data) {
      try {
        const videoData = JSON.parse(decodeURIComponent(options.data))
        // 兼容历史记录中仅存在 url 字段的旧数据
        if (!videoData.videoUrl && videoData.url) {
          videoData.videoUrl = videoData.url
        }
        console.log('视频数据:', videoData)
        console.log('视频下载URL:', videoData.videoUrl)
        console.log('原始URL:', videoData.originalUrl)
        
        // 检查视频URL的域名
        if (videoData.videoUrl) {
          try {
            // 使用正则表达式解析URL
            const urlMatch = videoData.videoUrl.match(/^(https?:\/\/[^\/]+)/)
            if (urlMatch) {
              const domain = urlMatch[1]
              console.log('视频URL域名:', domain)
              console.log('完整视频URL:', videoData.videoUrl)
              
              // 显示需要配置的域名
              console.log('需要在微信公众平台配置的域名:', domain)
              console.log('配置路径: 开发 → 开发管理 → 服务器域名 → downloadFile合法域名')
            }
          } catch (e) {
            console.error('URL解析失败:', e)
          }
        }
        
        // 提取视频域名用于显示
        let videoDomain = ''
        if (videoData.videoUrl) {
          try {
            // 使用正则表达式提取域名
            const urlMatch = videoData.videoUrl.match(/^(https?:\/\/[^\/]+)/)
            if (urlMatch) {
              videoDomain = urlMatch[1]
            }
          } catch (e) {
            console.error('域名提取失败:', e)
          }
        }
        
        this.setData({ 
          videoData,
          videoDomain
        })
      } catch (e) {
        console.error('解析视频数据失败:', e)
        wx.showToast({
          title: '数据解析失败',
          icon: 'none'
        })
        setTimeout(() => {
          wx.navigateBack()
        }, 1500)
      }
    }
  },

  // 下载视频
  downloadVideo() {
    const { videoData } = this.data
    if (!videoData || !videoData.videoUrl) {
      wx.showToast({
        title: '视频链接无效',
        icon: 'none'
      })
      return
    }

    // 通过服务端代理下载，避免前端直连被拦截，并传递文件名（使用视频标题）
    const rawTitle = (videoData.title || 'video').toString()
    const proxyUrl = `${getBaseUrl()}/down?url=${encodeURIComponent(videoData.videoUrl)}&filename=${encodeURIComponent(rawTitle)}`
    console.log('开始下载视频，代理URL:', proxyUrl)
    // 使用正则表达式提取域名（代理域名）
    const urlMatch = proxyUrl.match(/^(https?:\/\/[^\/]+)/)
    console.log('代理URL域名:', urlMatch ? urlMatch[1] : '未知')
    console.log('当前时间:', new Date().toISOString())
    this.setData({ 
      isLoading: true, 
      downloadFailed: false,
      retryCount: 0
    })

    // 下载视频文件
    const downloadTask = wx.downloadFile({
      url: proxyUrl,
      header: { 'Accept': 'video/*,*/*' },
      success: (res) => {
        console.log('下载成功，状态码:', res.statusCode)
        console.log('临时文件路径:', res.tempFilePath)
        console.log('响应头信息:', res.header)
        this.setData({ isLoading: false })
        
        if (res.statusCode === 200) {
          // 检查文件类型
          const contentType = res.header['content-type'] || res.header['Content-Type'] || ''
          console.log('文件类型:', contentType)
          
          // 检查是否是JSON响应
          if (contentType.includes('application/json') || contentType.includes('text/')) {
            console.error('下载的是JSON文件，不是视频文件')
            this.handleJsonResponse()
            return
          }
          
          // 文件较小时尝试判定是否为 JSON
          if (res.tempFilePath && !res.tempFilePath.includes('.mp4') && !res.tempFilePath.includes('.mov') && !res.tempFilePath.includes('.avi')) {
            console.log('文件路径:', res.tempFilePath)
            // 尝试读取文件内容检查是否是JSON
            wx.getFileInfo({
              filePath: res.tempFilePath,
              success: (fileInfo) => {
                console.log('文件大小:', fileInfo.size)
                if (fileInfo.size < 1024) { // 小于1KB可能是JSON响应
                  console.error('文件太小，可能是JSON响应')
                  this.handleJsonResponse()
                  return
                }
                this.saveVideoToAlbum(res.tempFilePath)
              },
              fail: () => {
                this.saveVideoToAlbum(res.tempFilePath)
              }
            })
          } else {
            this.saveVideoToAlbum(res.tempFilePath)
          }
        } else {
          console.error('下载失败，状态码:', res.statusCode)
          wx.showToast({
            title: '下载失败',
            icon: 'none'
          })
        }
      },
      fail: (err) => {
        this.setData({ isLoading: false, downloadFailed: true })
        console.error('下载失败:', err)
        console.error('错误详情:', JSON.stringify(err))
        console.error('错误类型:', err.errMsg)
        console.error('代理URL:', proxyUrl)
        
        // 根据不同的错误类型给出不同的提示
        let errorMsg = '下载失败，请重试'
        if (err.errMsg.includes('url not in domain list')) {
          errorMsg = '域名未配置，请复制链接到浏览器下载'
          const urlMatch = proxyUrl.match(/^(https?:\/\/[^\/]+)/)
          console.error('需要配置的域名:', urlMatch ? urlMatch[1] : '未知')
        } else if (err.errMsg.includes('network error')) {
          errorMsg = '网络错误，请检查网络连接'
        } else if (err.errMsg.includes('timeout')) {
          errorMsg = '下载超时，请重试'
        } else if (err.errMsg.includes('Provisional headers are shown')) {
          errorMsg = '请求被阻止，请检查域名配置'
        }
        
        wx.showToast({
          title: errorMsg,
          icon: 'none',
          duration: 3000
        })
        
        // 如果是域名相关错误，显示详细的操作指导
        if (err.errMsg.includes('url not in domain list') || err.errMsg.includes('Provisional headers are shown')) {
          setTimeout(() => {
            wx.showModal({
              title: '下载失败',
              content: '由于域名配置问题，无法直接下载。\n\n请点击"复制下载链接"按钮，然后在浏览器中打开链接进行下载。',
              showCancel: true,
              cancelText: '知道了',
              confirmText: '复制链接',
              success: (res) => {
                if (res.confirm) {
                  this.copyLink()
                }
              }
            })
          }, 2000)
        }
      }
    })

    // 监听下载进度
    downloadTask.onProgressUpdate((res) => {
      console.log('下载进度:', res.progress + '%')
      this.setData({
        downloadProgress: res.progress
      })
    })
  },

  // 复制下载链接
  copyLink() {
    const { videoData } = this.data
    if (videoData && videoData.videoUrl) {
      const rawTitle = (videoData.title || 'video').toString()
      const proxyUrl = `${getBaseUrl()}/down?url=${encodeURIComponent(videoData.videoUrl)}&filename=${encodeURIComponent(rawTitle)}`
      wx.setClipboardData({
        data: proxyUrl,
        success: () => {
          wx.showToast({
            title: '下载链接已复制',
            icon: 'success'
          })
          
          // 显示详细使用说明
          setTimeout(() => {
            wx.showModal({
              title: '链接已复制',
              content: '下载链接已复制到剪贴板！\n\n使用步骤：\n1. 打开手机浏览器\n2. 在地址栏粘贴链接\n3. 打开链接后长按视频\n4. 选择"保存到相册"',
              showCancel: false,
              confirmText: '知道了'
            })
          }, 1000)
        }
      })
    } else {
      wx.showToast({
        title: '没有可复制的链接',
        icon: 'none'
      })
    }
  },

  // 处理JSON响应
  handleJsonResponse() {
    const { retryCount, maxRetries } = this.data
    
    if (retryCount < maxRetries) {
      console.log(`检测到JSON响应，第${retryCount + 1}次重试`)
      this.setData({
        retryCount: retryCount + 1
      })
      
      wx.showToast({
        title: `重试中... (${retryCount + 1}/${maxRetries})`,
        icon: 'loading',
        duration: 1000
      })
      
      // 延迟1秒后重试
      setTimeout(() => {
        this.downloadVideo()
      }, 1000)
    } else {
      console.error('重试次数已达上限，停止重试')
      this.setData({
        downloadFailed: true,
        retryCount: 0
      })
      
      wx.showToast({
        title: '视频链接不稳定，请使用复制链接功能',
        icon: 'none',
        duration: 3000
      })
    }
  },

  // 保存视频到相册
  saveVideoToAlbum(filePath) {
    wx.saveVideoToPhotosAlbum({
      filePath: filePath,
      success: () => {
        console.log('视频已保存到相册')
        wx.showToast({
          title: '保存成功',
          icon: 'success'
        })
      },
      fail: (err) => {
        console.error('保存失败:', err)
        if (err.errMsg.includes('auth deny')) {
          wx.showModal({
            title: '提示',
            content: '需要授权访问相册才能保存视频',
            confirmText: '去设置',
            success: (modalRes) => {
              if (modalRes.confirm) {
                wx.openSetting()
              }
            }
          })
        } else {
          wx.showToast({
            title: '保存失败',
            icon: 'none'
          })
        }
      }
    })
  },

  // 返回首页
  goHome() {
    wx.navigateBack()
  }
})
